'''
 数据说明： Pima Indians Diabetes Data Set（皮马印第安人糖尿病数据集）
 根据现有的医疗信息预测5年内皮马印第安人糖尿病发作的概率。
字段说明
数据集共9个字段:
pregnants：怀孕次数
Plasma_glucose_concentration：口服葡萄糖耐量试验中2小时后的血浆葡萄糖浓度
blood_pressure：舒张压，单位:mm Hg
Triceps_skin_fold_thickness：三头肌皮褶厚度，单位：mm
serum_insulin：餐后血清胰岛素，单位:mm
BMI：体重指数（体重（公斤）/ 身高（米）^2）
Diabetes_pedigree_function：糖尿病家系作用
Age：年龄
Target：标签， 0表示不发病，1表示发病
'''
import pandas as pd
import numpy as np
from sklearn.model_selection import GridSearchCV
#竞赛的评价指标为logloss
from sklearn.metrics import log_loss
#svm并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量
from sklearn.metrics import accuracy_score
from matplotlib import pyplot
import seaborn as sns
train = pd.read_csv("./FE_pima-indians-diabetes.csv")
#把Xy分开
y_train = train['Target']
X_train = train.drop(["Target"], axis=1)
###RBF核SVM正则参数调优
#RBF核是svm最常用的核函数
#RBF核的需要调整正则超参数包括C（正则系数，一般在log域）和核函数的宽度gamma）
#C越小，决策边界越平滑
#gamma越小，决策边界越平滑
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]
gammas = [0.0001, 0.001, 0.01, 0.1, 1]
param_grid = {'C':Cs, 'gamma': gammas}
grid = GridSearchCV(SVC(kernel='rbf'),param_grid,cv=5,n_jobs=4)
grid.fit(X_train, y_train)
print(grid.best_score_)
print(grid.best_params_)
#plot cv 误差曲线
test_means = grid.cv_results_['mean_test_score']
test_stds = grid.cv_results_['std_test_score']
n_Cs = len(Cs)
number_gamms=len(gammas)
test_scores = np.array(test_means).reshape(n_Cs, number_gamms)
test_stds=np.array(test_stds).reshape(n_Cs, number_gamms)
x_axis = np.log10(Cs)
for i, value in enumerate(gammas):
    pyplot.plot(x_axis,test_scores[:, i], label=gammas[i])
pyplot.legend
pyplot.xlabel('log(C)')
pyplot.ylabel('accuary')
pyplot.savefig('SVMGridSearchCV_C.png')
pyplot.show()
'''
0.7682291666666666
{'C': 100, 'gamma': 0.001}
'''
















